//
//  main.c
//  wangzuo3-28
//
//  Created by mac on 16-3-28.
//  Copyright (c) 2016年 wangzuo. All rights reserved.
//

#include <stdio.h>
#include "stdlib.h"

//队列的定义
typedef struct sque
{
    int *front;//队首指针
    int *rear;//队尾指针
    int data[40];
}Sque;

//初始化队列
Sque init_sque(void)
{
    Sque q;
    q.front=(int *)malloc(40*sizeof(int));
    q.rear=q.front=0;
    return q;
}

//入队
void in_que(Sque q,int e)
{
    if(q.front-q.rear>=40)
    {
        printf("队列满了\n");
        return;
    }
    
}

//栈的类型定义
typedef struct sstack
{
    int *top;//栈顶指针
    int *bottom;//栈底指针
    int stacksize;//栈已经分配的空间大小

}Sstack;

//栈的初始化，将栈返回
Sstack init_stack(void)
{
    Sstack s;
    //给栈底分配空间
    s.bottom=(int *)malloc(40*sizeof(int));
    if(!s.bottom)
    {
        printf("内存分配失败!\n");
        exit(0);
    }
    //如果栈底分配成功，就要将栈置空
    s.top=s.bottom;
    //设置栈的当前空间大小
    s.stacksize=40;
    return s;
}

//入栈（压栈、进栈）操作
void push(Sstack s,int e)
{
    //判断栈是否已经满了，如果满栈，需要增加空间
    if(s.top-s.bottom>=s.stacksize)
    {
        //满栈需要重新分配空间
        s.bottom=(int *)malloc((s.stacksize+1)*sizeof(int));
        //如果分配失败，提示并退出
        if(!s.bottom)
        {
            printf("内存不足，分配空间失败\n");
            exit(0);
        }
        else
        {
            s.top=s.bottom+s.stacksize;
            //将空间＋1
            s.stacksize++;
        }
    }
    //将e设置成栈顶元素的值
    *s.top=e;
    s.top++;
}

//出栈（弹栈）操作
int pop(Sstack s)
{
    //判断里面是否有没有元素可以弹出，是否是空栈
    if(s.top==s.bottom)
    {
        printf("该栈为空，不允许操作！\n");
        exit(0);
    }
    //将栈顶指针－1
    s.top--;
    //将栈顶元素返回
    return *s.top;
}

int main(int argc, const char * argv[])
{
    //创建栈
    Sstack s;
    return 0;
}

